home *** CD-ROM | disk | FTP | other *** search
/ Developer Helper 1: Phil & Dave's Excellent CD / Excellent CD HFS.raw / Moof / Goodies / HyperCard Goodies / HyperCard Dev. ToolKit / XCMD.Sources / recvUpTo.p < prev    next >
Text File  |  1987-08-17  |  4KB  |  151 lines

  1. {$R-}
  2.  
  3. (*
  4.     recvUpTo(port number, termination character, waitTime, echo, edit) -- Return a string from the
  5.         serial port; return everything available, up to the termination character (if any). Pass an empty
  6.         termination character to receive everything available. WaitTime is the amount of time to wait
  7.         for the input, in ticks (60ths of a second). Echo is true to enable echoing. Edit is
  8.         true to enable edit characters (i.e., backspace).
  9.         
  10.     By Harry Chesley.  DO NOT call the author!  Contact Apple Developer 
  11.     Support on AppleLink "MacDTS" or on MCI "MacTech".
  12.  
  13.     ©Apple Computer, Inc. 1987
  14.     All Rights Reserved.
  15.  
  16.     To compile and link this file using Macintosh Programmer's Workshop,
  17.  
  18.     pascal -w recvUpTo.p
  19.     link -m ENTRYPOINT -o HyperTerm -rt XFCN=0 -sn Main=recvUpTo recvUpTo.p.o "{MPW}"Libraries:interface.o
  20.     
  21. *)
  22.  
  23. {$S recvUpTo }     { Segment name must be the same as the command name. }
  24.  
  25. unit DummyUnit;
  26.  
  27. interface
  28.  
  29. uses MemTypes, QuickDraw, OSIntf, ToolIntf, HyperXCmd;
  30.  
  31. procedure EntryPoint(paramPtr: XCmdPtr);
  32.     
  33. implementation
  34.  
  35. const
  36.  
  37. return = chr(13);
  38. linefeed = chr(10);
  39. bs = chr(8);
  40.  
  41. type
  42.  
  43. Str31 = String[31];
  44.  
  45. procedure recvUpTo(paramPtr: XCmdPtr); forward;
  46.  
  47. procedure EntryPoint(paramPtr: XCmdPtr);
  48.  
  49.     begin
  50.         recvUpTo(paramPtr);
  51.     end;
  52.  
  53. procedure recvUpTo(paramPtr: XCmdPtr);
  54.  
  55.     var portNumber: integer;
  56.         inPort, outPort: integer;
  57.         str: Str255;
  58.         l: longInt;
  59.         waitForChars: longInt;
  60.         lookForTerm: boolean;
  61.         termChar: char;
  62.         echoOn: boolean;
  63.         editOn: boolean;
  64.         linefeedStr: string[1];
  65.         bsStr: string[3];
  66.  
  67.     {$I XCmdGlue.inc}
  68.  
  69.     procedure Fail(errMsg: Str255); { set theResult and quit }
  70.         begin
  71.             paramPtr^.returnValue := PasToZero(errMsg);
  72.             exit(recvUpTo);
  73.         end;
  74.  
  75.     begin
  76.         if paramPtr^.paramCount <> 5 then Fail('parameter count is not 5');
  77.  
  78.         ZeroToPas(paramPtr^.params[1]^,str);        { First parameter is port number. }
  79.         portNumber := StrToNum(str);
  80.         if (portNumber < 1) or (portNumber > 2) then Fail('invalid port number');
  81.         ZeroToPas(paramPtr^.params[2]^,str);        { Second parameter is termination character. }
  82.         if length(str) = 0 then lookForTerm := false
  83.         else
  84.             begin
  85.                 lookForTerm := true;
  86.                 termChar := str[1];
  87.             end;
  88.         ZeroToPas(paramPtr^.params[3]^,str);        { Third parameter is whether to wait. }
  89.         waitForChars := StrToNum(str);
  90.         ZeroToPas(paramPtr^.params[4]^,str);        { Fourth parameter is whether to echo. }
  91.         echoOn := false;
  92.         if length(str) > 0 then
  93.             if (str[1] = 't') or (str[1] = 'T') then echoOn := true;
  94.         ZeroToPas(paramPtr^.params[5]^,str);        { Fifth parameter is whether to edit. }
  95.         editOn := false;
  96.         if length(str) > 0 then
  97.             if (str[1] = 't') or (str[1] = 'T') then editOn := true;
  98.  
  99.         if portNumber = 1 then
  100.             begin
  101.                 inPort := -6;
  102.                 outPort := -7;
  103.             end
  104.         else
  105.             begin
  106.                 inPort := -8;
  107.                 outPort := -9;
  108.             end;
  109.         linefeedStr[0] := chr(1); linefeedStr[1] := linefeed;
  110.         bsStr := '   '; bsStr[1] := bs; bsStr[3] := bs;
  111.         str := '';
  112.         waitForChars := waitForChars + TickCount;
  113.         while TickCount <= waitForChars do
  114.             begin
  115.                 if SerGetBuf(inPort,l) <> noErr then Fail('SerGetBuf failed');
  116.                 if l = 0 then cycle;
  117.                 str[0] := chr(integer(str[0])+1);
  118.                 l := 1;
  119.                 if FSRead(inPort,l,Ptr(ord4(@str)+ord(str[0]))) <> noErr then Fail('FSRead failed');
  120.                 if echoOn then
  121.                     begin
  122.                         l := 1;
  123.                         if FSWrite(outPort,l,Ptr(ord4(@str)+ord(str[0]))) <> noErr then Fail('FSWriter failed');
  124.                         if str[length(str)] = return then
  125.                             begin
  126.                                 l := length(linefeedStr);
  127.                                 if FSWrite(outPort,l,Ptr(ord4(@linefeedStr)+1)) <> noErr then Fail('FSWrite failed');
  128.                             end;
  129.                         if editOn and (str[length(str)] = bs) then
  130.                             begin
  131.                                 l := length(bsStr);
  132.                                 if FSWrite(outPort,l,Ptr(ord4(@bsStr)+1)) <> noErr then Fail('FSWrite failed');
  133.                             end;
  134.                     end;
  135.                 if editOn then
  136.                     begin
  137.                         if str[length(str)] = bs then
  138.                             begin
  139.                                 str[0] := chr(length(str)-1);
  140.                                 if length(str) > 0 then str[0] := chr(length(str)-1);
  141.                             end;
  142.                     end;
  143.                 if lookForTerm then
  144.                     if str[length(str)] = termChar then leave;
  145.                 if length(str) = 255 then leave;
  146.             end;
  147.         paramPtr^.returnValue := PasToZero(str);
  148.     end;
  149.  
  150. end.
  151.